package com.eedi.framework.user.service;

import com.eedi.framework.user.controller.org.vo.*;
import com.eedi.framework.common.enums.CommonStatusEnum;
import com.eedi.framework.common.enums.UserTypeEnum;
import com.eedi.framework.common.pojo.PageResult;
import com.eedi.framework.user.controller.org.vo.*;

import java.util.Collection;
import java.util.List;
import java.util.Set;


public interface OrgUserService {

    /**
     * 创建账号
     *
     * @param createReq 创建账号请求
     * @return 账号信息
     */
    OrgUserLoginInfoResp create(OrgUserAccountCreateReq createReq);

    OrgUserLoginInfoResp getLoginInfoByLoginId(String orgUserLoginId);

    /**
     * 判断密码是否匹配
     *
     * @param orgUserLoginId 登录账号
     * @return 是否匹配
     */
    boolean isPasswordMatch(String orgUserLoginId, String password);

    /**
     * 更新用户的最后登陆信息
     *
     * @param userId  用户编号
     * @param loginIp 登陆 IP
     */
    void updateUserLogin(String userId, String loginIp);

    /**
     * 账号列表
     *
     * @param req 查询条件
     * @return 账号分页列表
     */
    PageResult<OrgUserLoginInfoResp> page(OrgUserAccountPageReq req);

    /**
     * 账号列表
     *
     * @param req 查询条件
     * @return 账号分页列表
     */
    PageResult<OrgUserLoginInfoResp> page(OrgUserAccountPageReq req, Collection<String> orgUserIds);

    OrgUserLoginInfoResp selectByMobileAndRole(String mobile, UserTypeEnum userTypeEnum);


    OrgUserLoginInfoResp selectByLoginId(String loginId);

    List<OrgUserLoginInfoResp> selectByLoginIds(Set<String> loginIds);

    /**
     * 根据账号编号查询账号信息
     *
     * @param orgUserId 账号编号
     * @return 账号信息
     */
    OrgUserLoginInfoResp selectByOrgUserId(String orgUserId);

    /**
     * 根据用户ID列表查询用户信息
     *
     * @param orgUserIds id列表
     * @return 用户信息
     */
    List<OrgUserLoginInfoResp> selectByOrgUserIds(Collection<String> orgUserIds);

    OrgUserLoginInfoResp selectByOrgUserIdIgnoreStatus(String orgUserId);

    /**
     * 重置密码,并返回重置后的密码
     *
     * @param orgUserId 重制密码信息
     */
    String resetPassword(String orgUserId);

    /**
     * 重置手机号
     *
     * @param req 重制手机号信息
     */
    void resetMobile(OrgUserAccountResetMobileReq req);

    /**
     * 更新账号状态
     *
     * @param orgUserAccountId
     * @param status
     */
    void updateAccountStatus(String orgUserAccountId, CommonStatusEnum status);

    /**
     * 停用账号
     *
     * @param orgUserAccountId 账号ID
     */
    void disableByOrgUserAccountId(String orgUserAccountId);

    /**
     * 启用账号
     *
     * @param orgUserAccountId 账号ID
     */
    void enableByOrgUserAccountId(String orgUserAccountId);

    /**
     * 根据登录ID获取加密后的密码
     *
     * @param orgUserLoginId 登录ID
     * @return 密码
     */
    String getPwdByLoginId(String orgUserLoginId);

    /**
     * 修改用户信息
     *
     * @param orgUserId 用户ID
     * @param req       请求对象
     */
    void editOrgUserInfo(String orgUserId, OrgUserProfileEditReq req);

    /**
     * 修改密码
     *
     * @param req       请求对象
     * @param orgUserId 用户ID
     */
    void editPwd(String orgUserId, OrgUserProfileEditPwdReq req);

    /**
     * 获取账号数量
     *
     * @return 账号数量
     */
    Long countOrgUsers();

    /**
     * 更新账号信息
     *
     * @param req 请求体
     */
    void updateOrgUserInfo(OrgUserUpReq req);

    /**
     * 批量添加用户(Excel批量导入)
     *
     * @param fileUrl:excel文件路径
     * @return
     */
    OrgUserAccountBatchCreateResp batchCreate(String fileUrl) throws Exception;

    /**
     * 批量更新用户-科室关系（Excel导入配置数据）
     * @param fileUrl
     * @return
     * @throws Exception
     */
    OrgUserDeptBatchUpdateResp batchUpdateUserDept(String fileUrl) throws Exception;

    /**
     * 根据名称/登录ID查询用户(左匹配)
     */
    List<OrgUserSimpleResp> findUserSimple(OrgUserSimpleReq req);
}
